#include "stm32f10x.h"                  // Device header
#include "Motor_PWM.h"

// 差速转弯速度差
extern int diffSpeed;

void Motor_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_4 | GPIO_Pin_5; // A4-7用于控制电机正反转
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	Motor_PWM_Init();
}

// 电机前进
void Motor_forward(int left_speed, int right_speed){
	// 10正转
	// 左电机
	GPIO_SetBits(GPIOA, GPIO_Pin_4);
	GPIO_ResetBits(GPIOA, GPIO_Pin_5);
	// 右电机
	GPIO_SetBits(GPIOA, GPIO_Pin_6);
	GPIO_ResetBits(GPIOA, GPIO_Pin_7);
	// 通过设置占空比来设置电机速度
	Motor_PWM_SetCompare1(left_speed);
	Motor_PWM_SetCompare2(right_speed);
	
}

// 电机后退
void Motor_backward(int left_speed, int right_speed){
	// 01反转
	// 左电机
	GPIO_SetBits(GPIOA, GPIO_Pin_5);
	GPIO_ResetBits(GPIOA, GPIO_Pin_4);
	// 右电机
	GPIO_SetBits(GPIOA, GPIO_Pin_7);
	GPIO_ResetBits(GPIOA, GPIO_Pin_6);
	// 通过设置占空比来设置电机速度
	Motor_PWM_SetCompare1(left_speed);
	Motor_PWM_SetCompare2(right_speed);
}

// 原地左转
void Motor_spinLeft(int left_speed, int right_speed){
	// 左电机反转
	GPIO_SetBits(GPIOA, GPIO_Pin_5);
	GPIO_ResetBits(GPIOA, GPIO_Pin_4);
	// 右电机正转
	GPIO_SetBits(GPIOA, GPIO_Pin_6);
	GPIO_ResetBits(GPIOA, GPIO_Pin_7);
	// 通过设置占空比来设置电机速度
	Motor_PWM_SetCompare1(left_speed);
	Motor_PWM_SetCompare2(right_speed);
}

// 原地右转
void Motor_spinRight(int left_speed, int right_speed){
	// 左电机正转
	GPIO_SetBits(GPIOA, GPIO_Pin_4);
	GPIO_ResetBits(GPIOA, GPIO_Pin_5);
	// 右电机反转
	GPIO_SetBits(GPIOA, GPIO_Pin_7);
	GPIO_ResetBits(GPIOA, GPIO_Pin_6);
	// 通过设置占空比来设置电机速度
	Motor_PWM_SetCompare1(left_speed);
	Motor_PWM_SetCompare2(right_speed);
}

// 电机制动
void Motor_braking(void)
{
	// in1和in2高电平制动
	GPIO_SetBits(GPIOA, GPIO_Pin_4);
	GPIO_SetBits(GPIOA, GPIO_Pin_5);
	GPIO_SetBits(GPIOA, GPIO_Pin_6);
	GPIO_SetBits(GPIOA, GPIO_Pin_7);
}

// 电机停止
void Motor_stop(void)
{
	// in1和in2低电平停止
	GPIO_ResetBits(GPIOA, GPIO_Pin_4);
	GPIO_ResetBits(GPIOA, GPIO_Pin_5);
	GPIO_ResetBits(GPIOA, GPIO_Pin_6);
	GPIO_ResetBits(GPIOA, GPIO_Pin_7);
}

// 差速左转
void Motor_diffLeft(int speed){
	// 10正转
	// 左电机
	GPIO_SetBits(GPIOA, GPIO_Pin_4);
	GPIO_ResetBits(GPIOA, GPIO_Pin_5);
	// 右电机
	GPIO_SetBits(GPIOA, GPIO_Pin_6);
	GPIO_ResetBits(GPIOA, GPIO_Pin_7);
	// 通过设置占空比来设置电机速度
	Motor_PWM_SetCompare1(speed - diffSpeed); // 左轮慢右轮慢
	Motor_PWM_SetCompare2(speed);
}

// 差速右转
void Motor_diffRight(int speed){
	// 10正转
	// 左电机
	GPIO_SetBits(GPIOA, GPIO_Pin_4);
	GPIO_ResetBits(GPIOA, GPIO_Pin_5);
	// 右电机
	GPIO_SetBits(GPIOA, GPIO_Pin_6);
	GPIO_ResetBits(GPIOA, GPIO_Pin_7);
	// 通过设置占空比来设置电机速度
	Motor_PWM_SetCompare1(speed); // 与上相反
	Motor_PWM_SetCompare2(speed - diffSpeed);
}
